5. 异步操作、内存模型和 waitcnt
异步指令在发射时递增对应计数器,完成并提交结果后递减。waitcnt 的每个字段是“允许保留的最老序号阈值”;写全 0 等待该队列清空,写全 1(或字段最大保留值)表示不等待。sm 虽为 2 bit 且硬件最多 15 个 outstanding,但标记为乱序,只有 0 有意义,非零按保守实现处理为 0。
| 计数器 | 位数/上限 | 顺序 | 覆盖 |
|---|---|---|---|
vm | 6 / 62 | in-order | 向量 load、返回原子、scratch load、L1/L2 invalidate。 |
vst | 5 / 30 | in-order | 向量 store、非返回原子、image store/atomic、L2 writeback。 |
tex | 5 / 30 | in-order | texture sample/fetch/query、image load、返回 image atomic。 |
ls | 4 / 14 | in-order | shared/tile memory、插值、zs.test。 |
sm | 2 / 15 | out-of-order | uniform scalar memory load;只接受 0。 |
sfu | 3 / 6 | in-order | SFU 超越、除法、平方根。 |
fixed:n 延迟指令在 n 个周期后写回;async:<counter> 必须用相应 counter 等待。内存顺序采用 acquire/release:普通 global/buffer 访问按 program order 发射,barrier 建立 workgroup 内的 release/acquire,waitcnt 只保证指定队列完成,不替代跨 workgroup 的系统栅栏。cpol=def/nt/l2/sys 分别表示默认、non-temporal、强制 L2、系统级可见;host-coherent 页不进入 L2。L1 为 write-through,命中时更新,store 计数在 L2 确认后递减。